package com.itlong.cloud.property.service;

import com.itlong.cloud.POJO.DTO.property.*;
import com.itlong.cloud.POJO.DTO.sdk.CloudFaceApiDTO;
import com.itlong.cloud.POJO.PO.DeviceElevatorFloorConfigPO;
import com.itlong.cloud.POJO.PO.EquipPO;
import com.itlong.cloud.POJO.PO.ProductTypePO;
import com.itlong.cloud.POJO.VO.property.*;
import com.itlong.cloud.POJO.VO.sdk.SDKFaceDeviceInfoGetVO;
import com.itlong.cloud.utils.page.Page;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      物业设备管理服务接口
 * </desc>
 *
 * @createDate 2017/08/29
 */
public interface IPropertyEquipService {


    /**
     * <desc>
     *      DEMO示例。
     * <desc/>
     *
     * @param id 主键
     * @return hello
     * @author Wenchao.L
     * @createDate 2017/08/29
     */
    EquipPO getPersonById(Integer id);


    /**
     * <desc>
     *      DEMO示例。
     * <desc/>
     *
     * @param equipPO xxxxxx
     * @return hello
     * @author Wenchao.L
     * @createDate 2017/08/29
     */
    void insertPerson(EquipPO equipPO);

    /**
     * <desc>
     *      分页查询设备列表
     * <desc/>
     * @param   propertyEquipGetPageDTO     物业设备数据转换对象
     * @return
     * @author Biao.R
     * @createDate 2017/9/25
     */
    Page<PropertyEquipGetVO> getByPage(PropertyEquipGetPageDTO propertyEquipGetPageDTO) throws Exception;

    /**
     * <desc>
     *      查询设备归属地址
     * <desc/>
     * @param   deviceUnique    设备唯一码
     * @return  设备归属地集合
     * @author Biao.R
     * @createDate 2017/9/27
     */
    List<PropertyEquipAddressVO> getEquipAddressBynotAdress(String deviceUnique);

    /**
     * <desc>
     *      更新设备状态,并处理受影响用户的权限
     * <desc/>
     * @param   equipAddDTO    更新设备数据DTO
     * @author Biao.R
     * @createDate 2017/9/28
     */
    Integer updateStatus(PropertyCloudIntercomSaveDTO equipAddDTO);

    /**
     * <desc>
     *      根据设备唯一码查找设备
     * <desc/>
     * @param   deviceUnique   设备唯一码
     * @return
     * @author Biao.R
     * @createDate 2017/9/26
     */
    PropertyEquipGetVO getByDeviceUnique(String deviceUnique) throws Exception;

    /**
     * <desc>
     *      根据设备唯一码删除已有设备数据
     * <desc/>
     * @param   deviceUnique   设备唯一码
     * @return
     * @author Juguang.S
     * @createDate 2019/11/4
     */
    void deleteByDeviceUnique(String deviceUnique);

    /**
     * <desc>
     *      删除设备归属地址
     * <desc/>
     * @param   propertyProjectRemoveUnitInfoDTO  删除单元信息数据传输对象
     * @author Integer  返回解绑数量
     * @createDate 2017/9/29
     */
    Integer deleteAddress(PropertyProjectRemoveUnitInfoDTO propertyProjectRemoveUnitInfoDTO);

    /**
     * <desc>
     *      绑定设权限时分页获取设备
     * <desc/>
     * @param   propertyEquipAuthGetDTO  绑定设权限时分页获取设备DTO
     * @return   Page<Map<String, String>>    返回的设备分页信息
     * @author Biao.R
     * @createDate 2017/10/9
     */
    Page<PropertyEquipSimpleVO> getEquipAuthByPage(PropertyEquipAuthGetDTO propertyEquipAuthGetDTO) throws Exception;

    /**
     * <desc>
     *      获取用户设备权限列表
     * </desc>
     *
     * @param propertyEquipAuthGetDTO 绑定设权限时分页获取设备DTO
     * @return 返回的设备分页信息
     * @Author Zhu.yj
     * @createDate  2021/4/14
     */
    Page<PropertyEquipSimpleVO> getUserEquipAuthByPage(PropertyEquipAuthGetDTO propertyEquipAuthGetDTO) throws Exception;

    /**
     * <desc>
     *      根据设备机号或名称查找设备时否唯一
     * <desc/>
     * @param   propertyEquipGetDTO    设备唯一性查询DTO
     * @return  List<PropertyEquipGetVO>    查找出的设备集合
     * @author Biao.R
     * @createDate 2017/10/11
     */
    List<PropertyEquipGetVO> checkEquip(PropertyEquipGetDTO propertyEquipGetDTO) throws Exception;


    /**
     * <desc>
     *      通过楼层映射表权限标识查询逻辑楼层名称（批量）
     * <desc/>
     * @param   params    查询电梯对应楼层映射表的参数  {deviceUnique:naturalFloors}   如{"00000301":"1,2,3..."}
     * @return  查询出的楼层映射表对象集
     * @author Biao.R
     * @createDate 2017/11/20
     */
    List<PropertyElevatorFloorGetVO> getAllFloorByElevator(Map<String, String> params);

    /**
     * <desc>
     *      根据设备地址获取用户拥有的设备
     * <desc/>
     * @param   userDeviceAuthAddreddDTO    设备唯一性查询DTO
     * @return  List<AppUserGetDeviceAuthVO>   查找出的设备集合
     * @author Biao.R
     * @createDate 2017/10/12
     */
    AppUserDeviceAuthsVO getEquipByAddress(UserDeviceAuthAddreddDTO userDeviceAuthAddreddDTO) throws Exception;


    /**
     * <desc>
     *      根据地址查询云对讲设备
     * <desc/>
     * @param   cloudIntercomAddrDTO    设备类型
     * @return   List<PropertyEquipGetVO>   查询结果集
     * @author Biao.R
     * @createDate 2017/11/1
     */
    List<DeviceCloudIntercomSimpleVO> getCloudIntercomByAddr(PropertyEquipAuthGetDTO cloudIntercomAddrDTO);

    /**
     * <desc>
     *      根据地址获取对应设备
     * <desc/>
     * @param   userDeviceAuthAddreddDTOS  地址信息集
     * @return   List<AppUserDeviceAuthsVO> 住户权限设备信息集
     * @author zhangs
     * @createDate 2017/10/31
     */
    List<AppUserDeviceAuthsVO> getAuthDeviceByAddress(List<UserDeviceAuthAddreddDTO> userDeviceAuthAddreddDTOS) throws Exception;

    /**
     * <desc>
     *      通过楼层映射表权限标识查询楼层映射表（批量）
     * <desc/>
     * @param   deviceUnique    查询的电梯唯一码
     * @param   naturalFloors   电梯楼层映射表权限标识（多个以英文 , 分隔）
     * @return  查询出的楼层映射表对象集
     * @author Biao.R
     * @createDate 2017/11/20
     */
    List<DeviceElevatorFloorConfigPO> getByNaturalFloors(String deviceUnique,String naturalFloors);

    /**
     * <desc>
     *      通过房间楼层获取电梯NaturalFloor
     * <desc/>
     * @param  deviceUnique 电梯的设备唯一码
     * @param  floorNum 房间所在的楼层
     * @return 查询到的NaturalFloor
     * @author Biao.R
     * @createDate 2017/12/18
     */
    String getNaturalFlrByRoomFloor(String deviceUnique, String floorNum);

    /**
     * <desc>
     *      根据projectId查询项目云对讲设备数量
     * <desc/>
     * @param  projectId    查询的小区ID
     * @return 云对讲设备数量
     * @author Biao.R
     * @createDate 2018/1/12
     */
    Integer countCloudEquipByProjectId(String projectId);

    /**
     * <desc>
     *     根据projectId查询项目云对讲所有设备
     * </desc>
     *
     * @param propertyIntercomGetByProjectIdDTO 查询设备传输对象
     * @return 项目所有云对讲设备
     * @author wangzhi
     * @createDate 2018/3/26
     */
    Page<PropertyAllEquipGetVO> getAllEquipsByProjectId(PropertyIntercomGetByProjectIdDTO propertyIntercomGetByProjectIdDTO) throws Exception;

    /**
     * <desc>
     *      查找云电梯产品型号信息
     * </desc>
     *
     * @param typeId 云电梯类型
     * @return
     * @author Juguang.S
     * @createDate 2018/4/16
     */
    ProductTypePO getTypeId(Integer typeId);

    /**
     * <desc>
     *      根据设备唯一码获取有设备权限的一卡通用户
     * </desc>
     *
     * @param deviceUnique 设备唯一码
     * @return
     * @author JuGuang.S
     * @createDate 2018-04-17
     */
    List<EquipAuthUserGetVO> getSmartCardUser(String deviceUnique);

    /**
     * <desc>
     *      分页查询项目下或多媒体资源所绑定的所有支持平板人脸识别的设备
     * </desc>
     *
     * @param propertyPadFaceRecognitionGetForMediaDTO 使用projectId或mediaId查询该项目下所有支持人脸识别的云电梯或门禁设备数据传输对象
     * @return 分页查询结果
     * @author wangzhi
     * @createDate 2018/05/11
     */
    Page<PropertyPadFaceEquipVO> getPadFaceEquipByPage(PropertyPadFaceRecognitionGetForMediaDTO propertyPadFaceRecognitionGetForMediaDTO) throws Exception;

    /**
     * <desc>
     *      根据电梯设备的楼层范围变更重新设置物业临时授权的用户楼层权限
     * </desc>
     *
     * @param dto
     * @author Jiaqi.X
     * @createDate 2018/07/12
     */
    void changeUserElevatorFloorAuthByDeviceFloorChange(ElevatorFloorChangeDTO dto) throws Exception;

    /**
     * <desc>
     *      根据项目编号修改项目下设备的配置人脸识别的状态
     * </desc>
     *
     * @param projectId 设备唯一码
     * @return
     * @author JuGuang.S
     * @createDate 2018-07-03
     */
    void updateEquipFaceStatus(String projectId);

    /**
     * <desc>
     *      设置云对讲设备的待机界面
     * </desc>
     *
     * @param deviceUniqueStr
     * @param fileUrl 文件上传服务器的URL
     * @return
     * @author JuGuang.S
     * @createDate 2018-08-07
     */
    void setStandbyInterface(String deviceUniqueStr,String fileUrl) throws Exception;

    /**
     * <desc>
     * 修改电梯设备的楼层映射表
     * <desc/>
     *
     * @param deviceUniqueStr 电梯设备的deviceUnique号
     * @return 标准格式化响应结果
     * @author Juguang.S
     * @createDate 2018/08/21
     */
    Map<String,Object> updateFloorInfo(String deviceUniqueStr,List<ElevatorFloorInfoDTO> elevatorFloorDTOList,String projectId,Integer bracketPanel) throws Exception;

    /**
     * <desc>
     * 重置电梯设备的楼层映射表
     * <desc/>
     *
     * @param deviceUniqueStr 电梯设备的deviceUnique号，多个以逗号隔开
     * @return 标准格式化响应结果
     * @author Juguang.S
     * @createDate 2018/08/21
     */
    void resetFloorInfo(String deviceUniqueStr,String projectId) throws Exception;

    /**
     * <desc>
     * 根据deviceUnique获取电梯设备的楼层映射信息
     * <desc/>
     *
     * @param deviceUniqueStr 电梯设备的deviceUnique号
     * @return 标准格式化响应结果
     * @author Juguang.S
     * @createDate 2018/08/21
     */
    List<CloudElevatorFloorInfoVO> getElevatorFloorInfo(String deviceUniqueStr) throws Exception;

    /**
     * <desc>
     *      快速设置楼层映射表
     * </desc>
     *
     * @param startFloor
     * @param startTerminal
     * @param deviceUnique
     * @author Jiaqi.X
     * @createDate 2018/11/26
     */
    void floorFastSetting(String startFloor,String endFloor,String startTerminal,String deviceUnique,Integer type) throws Exception;

    /**
     * <desc>
     *      获取楼栋的地上及地下楼层
     * </desc>
     *
     * @param buildId
     * @return
     * @author Jiaqi.X
     * @createDate 2018/12/18
     */
    Map<String,Object> getBuildMaxFloorAndMinFloor(String buildId);

    /**
     * <desc>
     *      获取最大权限标识及最小权限标识
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2018/12/18
     */
    Map<String,Object> getMaxNaturalAndMinNatural(String deviceUnique);

    /**
     * <desc>
     *      查询云电梯楼层映射信息
     * </desc>
     *
     * @param deviceUnique 设备序列号
     * @return 云电梯楼层映射信息
     * @author wangzhi
     * @createDate 2019/01/21
     */
    PropertyDeviceElevatorConfigVO getDeviceElevatorConfig(String deviceUnique) throws Exception;

    /**
     * <desc>
     *      楼层映射表调整
     * </desc>
     *
     * @author Jiaqi.X
     * @createDate 2019/03/27
     */
    void floorMappingTrim();

    /**
     * <desc>
     *     兼容之前添加门禁设备的门禁类别
     * </desc>
     *
     * @author Juguang.S
     * @createDate 2019/02/21
     */
    void handleOldDataEntranceType() throws Exception;

    /**
     * <desc>
     *      云门禁上报设备的能力集信息
     * </desc>
     *
     * @param sn
     * @param capacitySet 能力集信息
     * @param doorCount 门数
     * @return
     * @author Juguang.S
     * @createDate 2019/02/22
     */
    void reportCapacitySet(String sn, String capacitySet, int doorCount,String deviceType) throws Exception;

    /**
     * <desc>
     *      云门禁获取固定密码
     * </desc>
     *
     * @param dto
     * @return
     * @author Juguang.S
     * @createDate 2019/02/22
     */
    CloudEntranceRoomPwdPageVO pullDevicePwd(CloudEntrancePageDTO dto) throws Exception;

    /**
     * <desc>
     *      云门禁校验动态开门密码
     * </desc>
     *
     * @return false-失败 true-成功
     * @author wangzhi
     * @createDate 2019/02/25
     */
    Boolean checkDynamicPwd(CloudIntercomDynamicPwdCheckDTO checkDTO) throws Exception;

    /**
     * <desc>
     *      查询指定电梯是否关联云群控器
     * </desc>
     *
     * @param deviceUnique 设备序列号
     * @return
     * @author Juguang.S
     * @createDate 2019/03/26
     */
    Integer isBindCloudController(String deviceUnique);

    /**
     * <desc>
     *      获取云电梯设备服务权限信息
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/04/30
     */
    Page<CloudEntranceDeviceAuthVO.Room> getDeviceServeRoomsByPage(CloudIntercomDeviceAuthGetDTO getDTO);

    /**
     * <desc>
     *      根据设备信息获取访客信息
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/04/30
     */
    List<CloudIntercomVisitorVO> getVisitorInfoByDevice(CloudIntercomDeviceAuthGetDTO getDTO) throws Exception;

    /**
     * <desc>
     *      获取项目配置的设置限制数量
     * <desc/>
     * @param   projectId   项目编号
     * @return
     * @author Juguang.S
     * @createDate 2019/08/05
     */
    Map<String,Object> getDeviceCountByProjectId(String projectId);

    /**
     * <desc>
     *      根据设备类型查询相对应设备的数量
     * <desc/>
     * @param   deviceType   设备类型 1电梯 2门禁 3电梯 4平板
     * @param   projectId    项目编号
     * @return
     * @author Juguang.S
     * @createDate 2019/08/05
     */
    Integer getDeviceCountByType(Integer deviceType,String projectId,String batchNumber);

    /**
     * <desc>
     *      判断一卡通是否需要注册iot
     * </desc>
     *
     * @param projectId 项目编号
     * @author Qiang.S
     * @createDate 2019/07/25
     */
    CloudElevatorVO checkSmartCardIot(String projectId);

    /**
     * <desc>
     *      检测设备是否存在
     * </desc>
     *
     * @param deviceUnique
     * @param type
     * @return
     * @author Jiaqi.X
     * @createDate 2019/11/25
     */
    Integer checkEquipExists(String deviceUnique,Integer type);

    /**
     * <desc>
     *      获取不同设备的批次号。
     * <desc/>
     *
     * @param  projectId 项目ID
     * @param  deviceType 设备类型1-电梯 2-门禁 3-云对讲 4-平板
     * @return
     * @author Juguang.S
     * @createDate 2019-11-21
     */
    List<String> getBatchNumber(String projectId, String deviceType) throws Exception;

    /**
     * <desc>
     *      获取批次号下的不同设备类型的设备数量。
     * <desc/>
     *
     * @param  projectId 项目ID
     * @param  deviceType 设备类型1-电梯 2-门禁 3-云对讲 4平板
     * @param  batchNumber 批次号
     * @return
     * @author Juguang.S
     * @createDate 2019-11-22
     */
    Integer getDeviceCountByBatchNumber(String projectId, String deviceType, String batchNumber) throws Exception;

    /**
     * <desc>
     *      访客二维码校验
     * </desc>
     *
     * @param checkQrCodeDTO  设备序列号
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/15
     */
    Boolean checkVisitorQrcode(CheckQrCodeDTO checkQrCodeDTO) throws Exception;

    /**
     * <desc>
     *      上传二维码通行记录
     * </desc>
     *
     * @param jsonRecord
     * @author Jiaqi.X
     * @createDate 2019/10/24
     */
    void uploadQrcodePssRecord(String jsonRecord,Integer deviceType,String sn) throws Exception;

    /**
     * <desc>
     *      检测业主记录是否已存在
     * </desc>
     *
     * @param userId
     * @param projectId
     * @param passTime
     * @return
     * @author Jiaqi.X
     * @createDate 2019/11/18
     */
    Integer checkOwnerRecordExists(String userId,String projectId,String passTime,String deviceUnique);

    /**
     * <desc>
     *      检测访客通行记录是否已存在
     * </desc>
     *
     * @param passId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/11/18
     */
    Integer checkVisitorExists(String passId,String passTime,String deviceUnique);

    /**
     * <desc>
     *      检测sdk通行记录是否存在
     * </desc>
     *
     * @param uid
     * @param projectId
     * @param openTime
     * @return
     * @author Jaiqi.X
     * @createDate 2019/11/18
     */
    Integer checkSDKQrcodeRecordExists(String uid,String projectId,String openTime,String deviceUnique,Integer passType);

    /**
     * <desc>
     *      获取设备信息 人脸api
     * </desc>
     *
     * @param dto
     * @author Qiang.S
     * @createDate 2019/11/06
     */
    List<SDKFaceDeviceInfoGetVO> getEquipInfoForApi(CloudFaceApiDTO dto);

    /**
     * <desc>
     *      分页查询设备相关人员权限
     * </desc>
     * @param deviceUnique 设备唯一码
     * @param deviceType 1-电梯 2-门禁 3-云对讲
     * @param userType 1-业主 2-访客 3-临时
     * @return
     * @author Qiang.S
     * @createDate 2020/06/02
     */
    Page<PropertyEquipUserInfoVO> getEquipUserInfo(String deviceUnique, String deviceType, String userType, Integer currentPage, Integer pageSize);


    /**
     * <desc>
     *      通过地址获取电梯设备
     * </desc>
     *
     * @param address
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/15
     */
    List<CloudElevatorVO> getElevatorListByAddress(Map<String,Object> address);

}
